package password

import (
	"fmt"
	"github.com/gofiber/fiber/v2"
	"sg-backend/global"
	"sg-backend/logger"
	"sg-backend/model/user"
	"sg-backend/utils"
)

type ChangePasswordDto struct {
	OldPassword  string `json:"oldPassword"`
	NewPassword1 string `json:"newPassword1"`
	NewPassword2 string `json:"newPassword2"`
}

func ChangePassword(ctx *fiber.Ctx) error {
	// 定义密码修改参数
	var changeDto ChangePasswordDto

	// 从body解释数据
	if err := ctx.BodyParser(&changeDto); err != nil {
		return ctx.JSON(fiber.Map{
			"status":  "error",
			"message": fmt.Sprintf("数据解释出错！%s", err),
		})
	}

	// 获取用户对象
	userObj := user.User{Id: global.AuthUser.UserId}
	r := global.DB.First(&userObj)
	if r.Error != nil {
		return ctx.JSON(fiber.Map{
			"status":  "error",
			"message": fmt.Sprintf("获取用户对象出错！%v", r.Error),
		})
	}

	// 数据解释完成，开始验证
	// 1，旧密码是否一致
	passwordStr := utils.SHAEncrypt(changeDto.OldPassword + userObj.PasswordSalt)
	if passwordStr != userObj.Password {
		return ctx.JSON(fiber.Map{
			"status":  "error",
			"message": "旧密码不正确！请确认！",
		})
	}

	// 验证新输入的密码是否一致
	// 判断密码是否相等
	if changeDto.NewPassword1 != changeDto.NewPassword2 {
		return ctx.JSON(fiber.Map{
			"status":  "error",
			"message": "两次输入的密码不一致，请确认！",
		})
	}

	// 验证全部完成，开始保存到数据库
	var passwordSalt = utils.GetRandomString(16)
	var encryptPassword = utils.SHAEncrypt(changeDto.NewPassword1 + passwordSalt)

	// 保存到数据库
	updateUser := user.User{}
	userObj.PasswordSalt = passwordSalt
	userObj.Password = encryptPassword
	r = global.DB.Model(&updateUser).Where("id = ?", global.AuthUser.UserId).Updates(
		user.User{Password: encryptPassword, PasswordSalt: passwordSalt},
	)
	if r.Error != nil {
		return ctx.JSON(fiber.Map{
			"status":  "error",
			"message": fmt.Sprintf("新密码保存到数据库失败！%v", r.Error),
		})
	}

	// 写日志
	logger.DbInfo(global.AuthUser.Username, "自助修改了用户密码！")

	// 处理完成，返回成功结果
	return ctx.JSON(fiber.Map{
		"status":  "done",
		"message": "密码修改成功！下次登录请使用新密码验证。",
	})
}
